package site.lianwu.mybatis.plus.query.reflection;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 实例获取工具，支持实例缓存
 *
 * @author LianWu
 */
@SuppressWarnings("unchecked")
public class InstanceGetters {

    /**
     * 实例缓存表
     */
    private static final Map<Class<?>, Object> instanceCache = new ConcurrentHashMap<>(32);

    private InstanceGetters() {}

    /**
     * 根据类型从缓存表中获取实例，若未命中缓存表，则调用实例获取器获取实例后缓存并返回
     *
     * @param clazz 实例所属类
     * @param defaultInstanceGetter 实例获取器
     * @return 实例
     * @param <T> 实例类型
     */
    public static <T> T getOrDefaultInstanceWithCache(Class<? extends T> clazz, InstanceGetter<T> defaultInstanceGetter) {
        return (T) instanceCache.computeIfAbsent(clazz, clz -> defaultInstanceGetter.get());
    }

    /**
     * 获取默认实例获取器（使用无参构造方法创建实例）
     * @param clazz 实例所属类
     * @return 实例获取器
     * @param <T> 实例类型
     */
    public static <T> InstanceGetter<T> getDefaultInstanceGetter(Class<? extends T> clazz) {
        return () -> Reflections.newInstance(Reflections.getDeclaredConstructor(clazz));
    }

}
